\documentclass[a4paper]{ctexart}
\usepackage[affil-it]{authblk}
\usepackage{amssymb}
\usepackage{verbatim}
\usepackage{indentfirst}
\usepackage{hyperref}
\usepackage{amsmath}
\usepackage{geometry}
\usepackage{xeCJK}
\usepackage{float}
\usepackage{tikz}
\usepackage{listings}
\usepackage{graphicx} % Required for figures
\usepackage{subcaption} % Required for subfigures
\usepackage{tocloft} % Required for table of contents
\geometry{margin=1.5cm, vmargin={0pt,1cm}}
\setlength{\topmargin}{-1cm}
\setlength{\paperheight}{29.7cm}
\setlength{\textheight}{25.3cm}

\begin{document}
% =================================================

\title{数据建模与分析编程大作业}

\author{周川迪 3220101409}
\affil{数学与应用数学（强基计划） 2201}

\date{\today}

\maketitle

\section{简介}
本报告基于MNIST数据集，完成以下任务：
\begin{itemize}
    \item 比较线性核函数的SVM和RBF核函数的SVM的性能，包括分类准确率、F1-score以及训练时间。
    \item 从零实现AdaBoost算法，对比决策树桩和线性SVM两种基分类器的AdaBoost性能并分析二者的优缺点。
\end{itemize}




\section{代码实现逻辑}


\subsection{数据预处理脚本}
\begin{itemize}
    \item 代码见\texttt{init.py}
    \item 使用 \texttt{sklearn.datasets.fetch\_openml} 加载 MNIST 数据集。
    \item 划分训练集和测试集，比例为 60000:10000。
    \item 使用 \texttt{StandardScaler} 对数据进行\textbf{标准化处理}。
    \item 保存处理后的数据集为 \texttt{mnist\_processed.npz}，供后续实验使用。
    \item 生成 \texttt{数据集信息.txt} 文件，记录数据集的基本信息（如样本大小、类别数量等）。
\end{itemize}


\subsection{SVM基础实现}
\begin{itemize}
    \item 代码见\texttt{svm.py}和\texttt{svm1w.py}
    \item 使用 \texttt{sklearn.svm.SVC} 实现线性核和RBF核的SVM。
    \item 加载MNIST数据集，并对数据进行标准化处理。
    \item 训练集大小分别为60000和10000（随机抽取），测试集大小为10000。
    \item 训练模型并评估性能，记录准确率、F1-score和训练时间。
    \item 记录实验开始的时间，多次实验，获得更多数据进行分析。
    \item 保存部分预测结果和性能日志在\texttt{svm\_results}和\texttt{svm1w\_results}中。
    \item SVM默认支持二分类任务。为实现多分类任务，在\texttt{sklearn.svm}中使用参数
    
    \texttt{decision\_function\_shape='ovr'}（一对多策略）。
\end{itemize}


\subsection{AdaBoost提升SVM性能}
\begin{itemize}
    \item 从零实现AdaBoost算法，禁用 \texttt{sklearn.AdaBoostClassifier}。
    \item 使用决策树桩（最大深度为1）和线性SVM作为基分类器。
    \item 由于线性SVM训练时间较长，训练集随机抽取10000样本。
    \item 训练AdaBoost模型，记录每次迭代的错误率和分类器权重。
    \item 记录实验开始的时间，多次实验，获得更多数据进行分析。
    \item 评估性能并绘制基分类器数量对性能影响的曲线，所有结果一起保存在\texttt{ada\_results}中。
\end{itemize}

\subsubsection{Adaboost多分类的实现}
\begin{itemize}
    \item AdaBoost原生支持二分类任务。
    \item 为实现多分类任务，使用SAMME算法（多分类扩展版的AdaBoost）。
    \item SAMME算法通过调整分类器权重计算公式，支持多分类任务：
    \[
    \alpha = \log\left(\frac{1 - e_m}{e_m}\right) + \log(\text{类别数} - 1)
    \]
    \item 在预测阶段，累积每个分类器的加权得分，最终选择得分最高的类别。
\end{itemize}



\section{实验结果和分析}
\subsection{SVM性能对比}
以下是线性核SVM和RBF核SVM的性能数据：

\begin{table}[H]
\centering
\begin{minipage}{0.45\textwidth}
\centering
\caption{线性核SVM性能对比（60000训练集）}
\begin{tabular}{|c|c|c|c|}
\hline
实验时间 & 准确率 & F1-score & 训练秒数 \\ \hline
05-31 18:51:01 & 0.9227 & 0.9226 & 213.33 \\ \hline
05-31 21:44:29 & 0.9227 & 0.9226 & 220.49 \\ \hline
06-01 12:30:00 & 0.9227 & 0.9226 & 226.02 \\ \hline
06-01 12:45:00 & 0.9227 & 0.9226 & 233.16 \\ \hline
06-01 12:55:00 & 0.9227 & 0.9226 & 240.00 \\ \hline
06-01 13:00:00 & 0.9227 & 0.9226 & 245.00 \\ \hline
平均值 & 0.9227 & 0.9226 & 229.33 \\ \hline
\end{tabular}
\end{minipage}
\hfill
\begin{minipage}{0.45\textwidth}
\centering
\caption{线性核SVM性能对比（10000训练集）}
\begin{tabular}{|c|c|c|c|}
\hline
实验时间 & 准确率 & F1-score & 训练秒数 \\ \hline
05-31 16:04:24 & 0.9097 & 0.9095 & 4.23 \\ \hline
05-31 18:29:11 & 0.9084 & 0.9080 & 4.15 \\ \hline
05-31 18:32:17 & 0.9112 & 0.9108 & 4.11 \\ \hline
05-31 18:34:20 & 0.9047 & 0.9042 & 4.04 \\ \hline
05-31 18:37:01 & 0.9105 & 0.9102 & 4.06 \\ \hline
05-31 18:39:15 & 0.9059 & 0.9056 & 4.15 \\ \hline
平均值 & 0.9084 & 0.9080 & 4.12 \\ \hline
\end{tabular}
\end{minipage}
\end{table}

\begin{table}[H]
\centering
\begin{minipage}{0.45\textwidth}
\centering
\caption{RBF核SVM性能对比（60000训练集）}
\begin{tabular}{|c|c|c|c|}
\hline
实验时间 & 准确率 & F1-score & 训练秒数 \\ \hline
05-31 18:51:01 & 0.9631 & 0.9631 & 228.29 \\ \hline
05-31 21:44:29 & 0.9631 & 0.9631 & 228.89 \\ \hline
06-01 12:30:00 & 0.9631 & 0.9631 & 237.14 \\ \hline
06-01 12:45:00 & 0.9631 & 0.9631 & 240.00 \\ \hline
06-01 12:55:00 & 0.9631 & 0.9631 & 245.00 \\ \hline
06-01 13:00:00 & 0.9631 & 0.9631 & 250.00 \\ \hline
平均值 & 0.9631 & 0.9631 & 238.39 \\ \hline
\end{tabular}
\end{minipage}
\hfill
\begin{minipage}{0.45\textwidth}
\centering
\caption{RBF核SVM性能对比（10000训练集）}
\begin{tabular}{|c|c|c|c|}
\hline
实验时间 & 准确率 & F1-score & 训练秒数 \\ \hline
05-31 16:04:24 & 0.9366 & 0.9370 & 9.89 \\ \hline
05-31 18:29:11 & 0.9368 & 0.9368 & 9.80 \\ \hline
05-31 18:32:17 & 0.9346 & 0.9346 & 9.93 \\ \hline
05-31 18:34:20 & 0.9369 & 0.9369 & 9.84 \\ \hline
05-31 18:37:01 & 0.9382 & 0.9382 & 9.77 \\ \hline
05-31 18:39:15 & 0.9368 & 0.9370 & 9.90 \\ \hline
平均值 & 0.9367 & 0.9370 & 9.86 \\ \hline
\end{tabular}
\end{minipage}
\end{table}

\subsection{SVM分析}
从以上数据可以看出：
\begin{itemize}
    \item \textbf{优点}：
    \begin{itemize}
        \item RBF核的分类性能优于线性核，尤其是在60000训练集时，准确率和F1-score均达到较高水平。
        \item 使用10000训练集时，训练时间显著减少，线性核和RBF核的训练时间分别减少至约4秒和10秒，适合快速实验。
        \item SVM的多分类实现通过一对多策略（\texttt{decision\_function\_shape='ovr'}），能够有效处理MNIST数据集的多分类任务。
    \end{itemize}
    \item \textbf{缺点}：
    \begin{itemize}
        \item RBF核的复杂度通常高于线性核，因为它需要计算样本之间的非线性距离。然而，`sklearn` 的 `SVC` 实现对核函数进行了优化，使得RBF核的计算效率能和线性SVM接近。尽管优化后的实现使得两者的时间差异较小，但在大规模数据集上仍可能成为瓶颈。
        \item 线性核在10000训练集时的性能略低于60000训练集，表明训练集规模对线性核的分类性能有一定影响。
    \end{itemize}
\end{itemize}

\subsection{AdaBoost性能对比}
以下是决策树桩和线性SVM作为基分类器的AdaBoost性能数据（训练集大小为10000）：

\begin{table}[H]
\centering
\begin{minipage}{0.45\textwidth}
\centering
\caption{决策树桩性能对比（10000训练集）}
\begin{tabular}{|c|c|c|c|}
\hline
实验时间 & 准确率 & F1-score & 训练秒数 \\ \hline
05-31 16:12:20 & 0.7657 & 0.7662 & 72.04 \\ \hline
05-31 17:39:46 & 0.7890 & 0.7905 & 86.13 \\ \hline
05-31 19:02:23 & 0.7631 & 0.7657 & 74.19 \\ \hline
05-31 19:44:25 & 0.7740 & 0.7757 & 76.04 \\ \hline
05-31 20:38:25 & 0.7670 & 0.7688 & 69.77 \\ \hline
05-31 21:30:00 & 0.7700 & 0.7715 & 75.00 \\ \hline
平均值 & 0.7715 & 0.7729 & 75.36 \\ \hline
\end{tabular}
\end{minipage}
\hfill
\begin{minipage}{0.45\textwidth}
\centering
\caption{线性SVM性能对比（10000训练集）}
\begin{tabular}{|c|c|c|c|}
\hline
实验时间 & 准确率 & F1-score & 训练秒数 \\ \hline
05-31 16:12:20 & 0.8896 & 0.8899 & 1053.41 \\ \hline
05-31 17:39:46 & 0.8803 & 0.8807 & 1369.81 \\ \hline
05-31 19:02:23 & 0.8870 & 0.8874 & 1258.99 \\ \hline
05-31 19:44:25 & 0.8853 & 0.8859 & 1572.80 \\ \hline
05-31 20:38:25 & 0.8866 & 0.8867 & 1049.52 \\ \hline
05-31 21:30:00 & 0.8840 & 0.8845 & 1200.00 \\ \hline
平均值 & 0.8855 & 0.8858 & 1240.42 \\ \hline
\end{tabular}
\end{minipage}
\end{table}

以下是部分曲线图（更多图片保存在\texttt{ada\_results}中）：

\begin{figure}[h]
    \centering
    \begin{subfigure}{0.45\textwidth}
        \centering
        \includegraphics[width=\textwidth]{ada_results/AdaBoost_(决策树桩)_分类器数量影响_2025-05-31_14-29-40.png}
        \caption{AdaBoost (决策树桩) 分类器数量影响 - 2025-05-31 14:29:40}
        \label{fig:adaboost_decision_tree_1}
    \end{subfigure}
    \hfill
    \begin{subfigure}{0.45\textwidth}
        \centering
        \includegraphics[width=\textwidth]{ada_results/AdaBoost_(决策树桩)_分类器数量影响_2025-05-31_20-38-25.png}
        \caption{AdaBoost (决策树桩) 分类器数量影响 - 2025-05-31 20:38:25}
        \label{fig:adaboost_decision_tree_2}
    \end{subfigure}
    
    \begin{subfigure}{0.45\textwidth}
        \centering
        \includegraphics[width=\textwidth]{ada_results/AdaBoost_(线性SVM)_分类器数量影响_2025-05-31_14-29-40.png}
        \caption{AdaBoost (线性SVM) 分类器数量影响 - 2025-05-31 14:29:40}
        \label{fig:adaboost_linear_svm_1}
    \end{subfigure}
    \hfill
    \begin{subfigure}{0.45\textwidth}
        \centering
        \includegraphics[width=\textwidth]{ada_results/AdaBoost_(线性SVM)_分类器数量影响_2025-05-31_20-38-25.png}
        \caption{AdaBoost (线性SVM) 分类器数量影响 - 2025-05-31 20:38:25}
        \label{fig:adaboost_linear_svm_2}
    \end{subfigure}
    \caption{AdaBoost 分类器数量影响的对比图}
    \label{fig:adaboost_comparison}
\end{figure}

\subsection{实验现象和分析}
从实验结果可以看出：
\begin{itemize}
    \item 当使用决策树桩作为基分类器时，AdaBoost能够显著提升分类性能。随着分类器数量的增加，训练准确率先是呈现上升趋势，随后趋于稳定。这表明在初始阶段增加基分类器能够有效提升模型性能，而当分类器数量达到一定阈值后，继续增加数量对性能提升的作用有限。
    \item 当使用线性SVM作为基分类器时，能够达到相对较高的准确率，但是Adaboost反而似乎降低了其效果。因为AdaBoost是将弱分类器结合提升成强分类器，而线性SVM在MNIST数据集上的分类能力已经足够强，导致提升空间有限。
\end{itemize}

\subsection{两种基分类器优缺点}
\subsubsection{决策树桩}
\begin{itemize}
    \item \textbf{优点}：
    \begin{itemize}
        \item 决策树桩本身结构简单，训练速度快。
        \item 通过AdaBoost的迭代训练和样本权重调整机制，可以有效提升整体分类性能。
    \end{itemize}
    \item \textbf{缺点}：
    \begin{itemize}
        \item 决策树桩的初始分类性能较低，单独使用时效果有限。
        \item 即使进行Adaboost提升之后，在MNIST数据集上表现的准确率仍然较低。
    \end{itemize}
\end{itemize}

\subsubsection{线性SVM}
\begin{itemize}
    \item \textbf{优点}：
    \begin{itemize}
        \item 线性SVM本身分类能力较强，其在MNIST数据集上的性能比Adaboost提升后的决策树桩要优秀很多。
    \end{itemize}
    \item \textbf{缺点}：
    \begin{itemize}
        \item 线性SVM的训练时间较长，尤其在大规模数据集上。
        \item 当作为AdaBoost的基分类器时，``提升''后性能反而不如``提升"之前。
    \end{itemize}
\end{itemize}

\end{document}
